package cn.changeforyou.web.dao.mybatis.ext.metaInfo.condition;

import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;
import org.apache.ibatis.type.UnknownTypeHandler;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
 * 条件信息
 *
 * @author zhyu
 * @version 1.0
 * @Condition不能和@Between,@Conditions共用
 * @date 2022/2/17 13:03
 */
@Target(FIELD)
@Retention(RUNTIME)
public @interface Condition {

    /**
     * 条件类型
     *
     * @return
     */
    ConditionType type() default ConditionType.equal;

    /**
     * 解析时key为blank时解析为字段名， 禁止在一个类重复，key只能被使用一次，
     * 如果要使用多次那就再来个@Condition但是key不一样
     *
     * @return
     */
    String key() default "";

    /**
     * 数据库中 列名
     *
     * @return
     */
    String columnName() default "";

    /**
     * 是否是或, 默认and
     *
     * @return
     */
    boolean or() default false;

    /**
     * 追加 or列 is null
     * 如 username not like concat('xx', '%')的情况 如果该字段is null 那么该行业不会被选出来。 但一般业务中， 如果添加了表否定的添加，
     * 我们希望is null 也可以被选中， 这是设置这个方法的值为true即可
     *
     * @return
     */
    boolean appendOrColumnIsNull() default false;

    /**
     * 用于between
     */
    SubWherePosition position() default SubWherePosition.after;

    JdbcType jdbcType() default JdbcType.UNDEFINED;

    Class<? extends TypeHandler> typeHandler() default UnknownTypeHandler.class;
}
